{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### ndarray对象 n维数组  创建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3]\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "[[1 2 3 4 5]]\n",
      "[1.+0.j 2.+0.j 3.+0.j]\n",
      "[1 2 3]\n",
      "[1 2 3]\n",
      "[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']\n",
      "[0. 1. 2. 3. 4.]\n",
      "[0 1 2 3 4]\n",
      "[10 12 14 16 18]\n",
      "[10.  12.5 15.  17.5 20. ]\n",
      "[10. 12. 14. 16. 18.]\n",
      "[ 10.          12.91549665  16.68100537  21.5443469   27.82559402\n",
      "  35.93813664  46.41588834  59.94842503  77.42636827 100.        ]\n",
      "[  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "a = np.array([1,2,3])  \n",
    "print (a)\n",
    "a = np.array([[1,  2],  [3,  4]])  \n",
    "print (a)\n",
    "a = np.array([1, 2, 3, 4, 5], ndmin =  2)  # []的个数不同 \n",
    "print (a)\n",
    "a = np.array([1,  2,  3], dtype = complex)  \n",
    "print (a)\n",
    "\n",
    "a = np.asarray([1,2,3])  \n",
    "print (a)\n",
    "a = np.asarray((1,2,3))  \n",
    "print (a)\n",
    "\n",
    "s =  b'Hello World' \n",
    "a = np.frombuffer(s, dtype =  'S1')  \n",
    "print (a)\n",
    "\n",
    "list=range(5)\n",
    "x=np.fromiter(list, dtype=float)\n",
    "print(x)\n",
    "\n",
    "x = np.arange(5)  \n",
    "print (x)\n",
    "x = np.arange(10,20,2)  \n",
    "print (x)\n",
    "\n",
    "a = np.linspace(10,20,5)   # 等差数列\n",
    "print(a)\n",
    "a = np.linspace(10, 20,  5, endpoint =  False)  \n",
    "print(a)\n",
    "\n",
    "a = np.logspace(1.0,  2.0, num =  10)   # 等比数列\n",
    "print (a)\n",
    "a = np.logspace(0,9,10,base=2)\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 对象的元素类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "int32\n",
      "[('age', 'i1')]\n",
      "[(10,) (20,) (30,)]\n",
      "[10 20 30]\n",
      "[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]\n",
      "[(b'abc', 21, 50.) (b'xyz', 18, 75.)]\n"
     ]
    }
   ],
   "source": [
    "dt = np.dtype(np.int32)\n",
    "print(dt)\n",
    "\n",
    "dt = np.dtype([('age',np.int8)]) \n",
    "print(dt)\n",
    "a = np.array([(10,),(20,),(30,)], dtype = dt) \n",
    "print(a)\n",
    "print(a['age'])\n",
    "\n",
    "student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) \n",
    "print(student)\n",
    "a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) \n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "(2, 3)\n",
      "2\n",
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(24)   # 维度的数量\n",
    "print (a.ndim)            \n",
    "\n",
    "a = np.array([[1,2,3],[4,5,6]])  \n",
    "print(a)\n",
    "print (a.shape)  # n行n列\n",
    "print(a.ndim)\n",
    "\n",
    "a.shape=(3,2)  \n",
    "print(a)\n",
    "\n",
    "b=a.reshape(2,3)\n",
    "print(b)\n",
    "print(b.ndim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n",
      "[0. 0. 0. 0. 0.]\n",
      "[[(0, 0) (0, 0)]\n",
      " [(0, 0) (0, 0)]]\n",
      "[1. 1. 1. 1. 1.]\n",
      "[[1 1]\n",
      " [1 1]]\n",
      "[[0 0 0]\n",
      " [0 0 0]\n",
      " [0 0 0]]\n",
      "[[1 1 1]\n",
      " [1 1 1]\n",
      " [1 1 1]]\n"
     ]
    }
   ],
   "source": [
    "x = np.empty([3,2], dtype = int) \n",
    "print (x)\n",
    "\n",
    "x = np.zeros(5) \n",
    "print(x)\n",
    "\n",
    "z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  \n",
    "print(z)\n",
    "\n",
    "x = np.ones(5) \n",
    "print(x)\n",
    " \n",
    "# 自定义类型\n",
    "x = np.ones([2,2], dtype = int)\n",
    "print(x)\n",
    "\n",
    "arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n",
    "zeros_arr = np.zeros_like(arr)\n",
    "print(zeros_arr)\n",
    "ones_arr = np.ones_like(arr)\n",
    "print(ones_arr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 切片和索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 4 6]\n",
      "[2 4 6]\n",
      "[[1 2 3]\n",
      " [3 4 5]\n",
      " [4 5 6]]\n",
      "[[3 4 5]\n",
      " [4 5 6]]\n",
      "[2 4 5]\n",
      "[3 4 5]\n",
      "[[2 3]\n",
      " [4 5]\n",
      " [5 6]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(10)\n",
    "s = slice(2,7,2)    \n",
    "print (a[s])   \n",
    "print(a[2:7:2])\n",
    "\n",
    "a = np.array([[1,2,3],[3,4,5],[4,5,6]])\n",
    "print(a)\n",
    "print(a[1:])\n",
    "print (a[...,1])   # 第2列元素\n",
    "print (a[1,...])   # 第2个元素\n",
    "print (a[...,1:])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n",
      "[1 4 5]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([[1,  2],  [3,  4],  [5,  6]]) \n",
    "print(x)\n",
    "y = x[[0,1,2],  [0,1,0]]  \n",
    "print(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 遍历"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2 6]\n",
      " [4 3]\n",
      " [5 1]]\n",
      "2-6-4-3-5-1-\n",
      "2,4,5,6,3,1,\n",
      "2=6=4=3=5=1="
     ]
    }
   ],
   "source": [
    "x = np.array([[2,  6],  [4,  3],  [5,  1]])\n",
    "print(x)\n",
    "\n",
    "for i in np.nditer(x, order='C'):\n",
    "    print(i, end=\"-\")\n",
    "\n",
    "print()\n",
    "    \n",
    "for i in np.nditer(x, order='F'):\n",
    "    print(i, end=\",\")\n",
    "    \n",
    "print()\n",
    "    \n",
    "for i in x.flat:\n",
    "    print(i, end=\"=\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 6 4 3 5 1]\n",
      "[2 4 5 6 3 1]\n"
     ]
    }
   ],
   "source": [
    "print(x.flatten())\n",
    "print(x.ravel(order=\"F\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0b1010\n",
      "0b1100\n",
      "8\n",
      "14\n"
     ]
    }
   ],
   "source": [
    "a = 10\n",
    "b = 12\n",
    "print(bin(a))\n",
    "print(bin(b))\n",
    "print(np.bitwise_and(a, b))\n",
    "print(np.bitwise_or(a, b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['welcome to ' 'url is www.baidu.com']\n",
      " wsl hello  wsl hello  wsl hello \n",
      "*****wsl hello******\n",
      "Python\n",
      "Welcome To China\n",
      "WELCOME TO PYTHON\n",
      "['Welcome', 'To', 'Python']\n",
      "welcome to Python\n",
      "['L:o:v:e' 'P-y-t-h-o-n']\n",
      "HEllo\n"
     ]
    }
   ],
   "source": [
    "print(np.char.add(['welcome', 'url'], [' to ', ' is www.baidu.com']))\n",
    "print(np.char.multiply(' wsl hello ', 3))\n",
    "print(np.char.center('wsl hello', 20, '*'))\n",
    "print(np.char.capitalize('python'))\n",
    "print(np.char.title(\"welcome to china\"))\n",
    "print(np.char.upper(\"Welcome To Python\"))\n",
    "print(np.char.splitlines(\"Welcome\\nTo\\nPython\"))\n",
    "print(np.char.strip(\"   welcome to Python    \"))\n",
    "print(np.char.join([':', '-'], ['Love', 'Python']))\n",
    "print(np.char.replace('HELLO', \"LLO\", \"llo\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### NumPy  IO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "[[1. 2. 3.]\n",
      " [4. 5. 6.]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[4,5,6]])\n",
    "b = np.arange(0, 1.0, 0.1)\n",
    "c = np.sin(b)\n",
    "# 二进制\n",
    "np.save('first.npy', a)\n",
    "print(np.load('first.npy'))\n",
    "\n",
    "# 文本格式\n",
    "np.savetxt('test.csv', a)\n",
    "print(np.loadtxt(\"test.csv\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt \n",
    " \n",
    "x = np.arange(1,11) \n",
    "y =  2  * x +  5 \n",
    "plt.title(\"Matplotlib demo\") \n",
    "plt.xlabel(\"x axis caption\") \n",
    "plt.ylabel(\"y axis caption\") \n",
    "plt.plot(x,y) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x =  [5,8,10] \n",
    "y =  [12,16,6] \n",
    "x2 =  [6,9,11] \n",
    "y2 =  [6,15,7] \n",
    "plt.bar(x, y, align =  'center') \n",
    "plt.bar(x2, y2, color =  'g', align =  'center') \n",
    "plt.title('Bar graph') \n",
    "plt.ylabel('Y axis') \n",
    "plt.xlabel('X axis') \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性代数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[37 40]\n",
      " [85 92]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4]])\n",
    "b = np.array([[11,12],[13,14]])\n",
    "print(np.dot(a,b))\n",
    "print(np.vdot(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
